:art: Update member_activity

huangqimin001 2 lat temu
rodzic
commit
0a3d06d643

+ 1 - 1
account/models.py

@@ -306,7 +306,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
306 306
             'subscribe': self.subscribe,
307 307
             'membercardid': self.membercardid,
308 308
             'memberusercardcode': self.memberusercardcode,
309
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
309
+            'created_at': tc.local_string(utc_dt=self.created_at),
310 310
             'code_version': self.code_version,
311 311
 
312 312
             # 商品信息

+ 48 - 23
api/admin_views.py

@@ -20,7 +20,7 @@ from account.models import UserInfo
20 20
 from api.encrypt_views import get_ciphertext
21 21
 from coupon.models import CouponInfo, UserCouponInfo
22 22
 from integral.models import SaleclerkSubmitLogInfo
23
-from logs.models import ComplementCodeLogInfo, MchInfoEncryptLogInfo, AdministratorLoginLogInfo
23
+from logs.models import AdministratorLoginLogInfo, ComplementCodeLogInfo, MchInfoEncryptLogInfo
24 24
 from mch.models import AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo
25 25
 from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityGroupShareInfo, MemberActivityInfo,
26 26
                            MemberActivitySignupInfo)
@@ -974,6 +974,7 @@ def member_activity_list(request):
974 974
     count = logs.count()
975 975
     logs, left = pagination(logs, page, num)
976 976
     logs = [log.admindata for log in logs]
977
+
977 978
     return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
978 979
         'logs': logs,
979 980
         'left': left,
@@ -1009,19 +1010,25 @@ def member_activity_update(request):
1009 1010
     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
1010 1011
     admin_id = request.POST.get('admin_id', '')
1011 1012
     activity_id = request.POST.get('activity_id', '')
1013
+    activity_type = int(request.POST.get('activity_type', 0))
1012 1014
     title = request.POST.get('title', '')
1013 1015
     subtitle = request.POST.get('subtitle', '')
1014 1016
     date = request.POST.get('date', '')
1017
+    start_date = request.POST.get('start_date', '')
1018
+    end_date = request.POST.get('end_date', '')
1019
+    start_display_date = request.POST.get('start_display_date', '')
1020
+    end_display_date = request.POST.get('end_display_date', '')
1015 1021
     city = request.POST.get('city', '')
1016 1022
     location = request.POST.get('location', '')
1017 1023
     integral = int(request.POST.get('integral', 0))
1018
-    cover_url = request.POST.get('cover_path', '')
1019
-    slider_image = request.POST.get('banner_path', '')
1020
-    image = request.POST.get('banner_path', '')
1024
+    is_slider = request.POST.get('is_slider', '')
1025
+    slider_image_path = request.POST.get('banner_path', '')
1026
+    cover_path = request.POST.get('cover_path', '')
1027
+    # image_path = request.POST.get('image_path', '') or request.POST.get('banner_path', '')
1028
+    limit_image_num = int(request.POST.get('limit_image_num', 3))
1021 1029
     is_signup = request.POST.get('is_signup', '')
1022 1030
     group_share_max_integral = int(request.POST.get('share_max_integral', 0))
1023 1031
     group_share_integral = int(request.POST.get('share_integral', 0))
1024
-    is_slider = request.POST.get('is_slider', '')
1025 1032
     content_rich_text = request.POST.get('content_rich_text', '')
1026 1033
     share_h5_link = request.POST.get('share_h5_link', '')
1027 1034
     activity_state = int(request.POST.get('activity_state', 0))
@@ -1039,19 +1046,25 @@ def member_activity_update(request):
1039 1046
     except MemberActivityInfo.DoesNotExist:
1040 1047
         return response()
1041 1048
 
1049
+    log.activity_type = activity_type
1042 1050
     log.title = title
1043 1051
     log.subtitle = subtitle
1044
-    log.date = datetime.strptime(date + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
1052
+    log.date = date
1053
+    log.start_date = start_date
1054
+    log.end_date = end_date
1055
+    log.start_display_date = start_display_date
1056
+    log.end_display_date = end_display_date
1045 1057
     log.city = city
1046 1058
     log.location = location
1047 1059
     log.integral = integral
1048
-    log.cover = cover_url
1049
-    log.slider_image = slider_image
1050
-    log.image = slider_image
1060
+    log.is_slider = is_slider
1061
+    log.slider_image = slider_image_path
1062
+    log.cover = cover_path
1063
+    # log.image = image_path
1064
+    log.limit_image_num = limit_image_num
1051 1065
     log.is_signup = is_signup
1052 1066
     log.group_share_integral = group_share_integral
1053 1067
     log.group_share_max_integral = group_share_max_integral
1054
-    log.is_slider = is_slider
1055 1068
     log.content_rich_text = content_rich_text
1056 1069
     log.share_h5_link = share_h5_link
1057 1070
     log.activity_state = activity_state
@@ -1063,19 +1076,25 @@ def member_activity_update(request):
1063 1076
 def member_activity_create(request):
1064 1077
     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
1065 1078
     admin_id = request.POST.get('admin_id', '')
1079
+    activity_type = int(request.POST.get('activity_type', 0))
1066 1080
     title = request.POST.get('title', '')
1067 1081
     subtitle = request.POST.get('subtitle', '')
1068 1082
     date = request.POST.get('date', '')
1083
+    start_date = request.POST.get('start_date', '')
1084
+    end_date = request.POST.get('end_date', '')
1085
+    start_display_date = request.POST.get('start_display_date', '')
1086
+    end_display_date = request.POST.get('end_display_date', '')
1069 1087
     city = request.POST.get('city', '')
1070 1088
     location = request.POST.get('location', '')
1071 1089
     integral = int(request.POST.get('integral', 0))
1072
-    cover_url = request.POST.get('cover_path', '')
1073
-    slider_image = request.POST.get('banner_path', '')
1074
-    image = request.POST.get('banner_path', '')
1090
+    is_slider = request.POST.get('is_slider', '')
1091
+    slider_image_path = request.POST.get('banner_path', '')
1092
+    cover_path = request.POST.get('cover_path', '')
1093
+    # image_path = request.POST.get('image_path', '') or request.POST.get('banner_path', '')
1094
+    limit_image_num = int(request.POST.get('limit_image_num', 3))
1075 1095
     is_signup = request.POST.get('is_signup', '')
1076 1096
     group_share_max_integral = int(request.POST.get('share_max_integral', 0))
1077 1097
     group_share_integral = int(request.POST.get('share_integral', 0))
1078
-    is_slider = request.POST.get('is_slider', '')
1079 1098
     content_rich_text = request.POST.get('content_rich_text', '')
1080 1099
     share_h5_link = request.POST.get('share_h5_link', '')
1081 1100
     activity_state = int(request.POST.get('activity_state', 0))
@@ -1090,19 +1109,25 @@ def member_activity_create(request):
1090 1109
 
1091 1110
     MemberActivityInfo.objects.create(
1092 1111
         brand_id=administrator.brand_id,
1112
+        activity_type=activity_type,
1093 1113
         title=title,
1094 1114
         subtitle=subtitle,
1095 1115
         date=date,
1116
+        start_date=start_date,
1117
+        end_date=end_date,
1118
+        start_display_date=start_display_date,
1119
+        end_display_date=end_display_date,
1096 1120
         city=city,
1097 1121
         location=location,
1098 1122
         integral=integral,
1099
-        cover=cover_url,
1100
-        slider_image=slider_image,
1101
-        image=image,
1123
+        is_slider=is_slider,
1124
+        slider_image=slider_image_path,
1125
+        cover=cover_path,
1126
+        # image=image_path,
1127
+        limit_image_num=limit_image_num,
1102 1128
         is_signup=is_signup,
1103 1129
         group_share_max_integral=group_share_max_integral,
1104 1130
         group_share_integral=group_share_integral,
1105
-        is_slider=is_slider,
1106 1131
         content_rich_text=content_rich_text,
1107 1132
         share_h5_link=share_h5_link,
1108 1133
         activity_state=activity_state
@@ -1729,19 +1754,18 @@ def administrator_update(request):
1729 1754
 
1730 1755
     if admin_type != -1:
1731 1756
         target_admin.admin_type = admin_type
1732
-    
1757
+
1733 1758
     if phone:
1734 1759
         target_admin.phone = phone
1735
-    
1760
+
1736 1761
     if name:
1737 1762
         target_admin.name = name
1738 1763
         AdministratorLoginLogInfo.objects.filter(admin_id=target_admin_id).update(admin_name=name)
1739 1764
 
1740
-    
1741 1765
     if password:
1742 1766
         encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)
1743 1767
         target_admin.encryption = encryption
1744
-    
1768
+
1745 1769
     target_admin.save()
1746 1770
 
1747 1771
     return response(200, 'Update Admin Success', u'更新后台管理员成功')
@@ -1794,8 +1818,9 @@ def administrator_login_list(request):
1794 1818
     count = logs.count()
1795 1819
     logs, left = pagination(logs, page, num)
1796 1820
     logs = [log.admindata for log in logs]
1821
+
1797 1822
     return response(200, 'Get Administrator Login List Success', u'获取后台管理员登录日志成功', data={
1798 1823
         'logs': logs,
1799 1824
         'left': left,
1800 1825
         'count': count
1801
-    })
1826
+    })

+ 1 - 2
api/mch_views.py

@@ -17,7 +17,7 @@ from TimeConvert import TimeConvert as tc
17 17
 from account.models import UserInfo
18 18
 from coupon.models import CouponInfo, UserCouponInfo
19 19
 from integral.models import SaleclerkSubmitLogInfo
20
-from logs.models import MchInfoEncryptLogInfo, AdministratorLoginLogInfo
20
+from logs.models import AdministratorLoginLogInfo, MchInfoEncryptLogInfo
21 21
 from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo,
22 22
                         LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo)
23 23
 from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo
@@ -79,7 +79,6 @@ def admin_login_api(request):
79 79
     if not check_password(password, administrator.encryption):
80 80
         return response(AdministratorStatusCode.ADMINISTRATOR_PASSWORD_ERROR)
81 81
 
82
-    
83 82
     AdministratorLoginLogInfo.objects.create(
84 83
         admin_id=administrator.admin_id,
85 84
         admin_name=administrator.name,

+ 1 - 1
coupon/models.py

@@ -69,7 +69,7 @@ class CouponInfo(BaseModelMixin):
69 69
             'coupon_valid_period': self.coupon_valid_period,
70 70
             'coupon_expire_at': tc.local_string(utc_dt=self.coupon_expire_at, format='%Y-%m-%d'),
71 71
             'is_coupon_admin_writeoff': self.is_coupon_admin_writeoff,
72
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
72
+            'created_at': tc.local_string(utc_dt=self.created_at),
73 73
         }
74 74
 
75 75
     @property

+ 1 - 1
integral/models.py

@@ -186,5 +186,5 @@ class SaleclerkSubmitLogInfo(BaseModelMixin):
186 186
             'has_scan': self.has_scan,
187 187
             'image': self.image_url,
188 188
             'code_image': self.code_image_url,
189
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
189
+            'created_at': tc.local_string(utc_dt=self.created_at),
190 190
         }

+ 3 - 2
logs/admin.py

@@ -3,8 +3,8 @@
3 3
 from django.contrib import admin
4 4
 from django_admin import ReadOnlyModelAdmin
5 5
 
6
-from logs.models import (ComplementCodeLogInfo, MchInfoDecryptLogInfo, MchInfoEncryptLogInfo, MchLogInfo,
7
-                         MchSearchModelAndCameraLogInfo, AdministratorLoginLogInfo)
6
+from logs.models import (AdministratorLoginLogInfo, ComplementCodeLogInfo, MchInfoDecryptLogInfo, MchInfoEncryptLogInfo,
7
+                         MchLogInfo, MchSearchModelAndCameraLogInfo)
8 8
 
9 9
 
10 10
 class MchInfoEncryptLogInfoAdmin(ReadOnlyModelAdmin, admin.ModelAdmin):
@@ -32,6 +32,7 @@ class ComplementCodeLogInfoAdmin(admin.ModelAdmin):
32 32
     list_display = ('user_id', 'log_id', 'name', 'phone', 'model_id', 'model_name', 'sn', 'shot_image', 'invoice_image', 'audit_status', 'ciphertext', 'is_contacted', 'is_upload_qiniu', 'status', 'created_at', 'updated_at')
33 33
     list_filter = ('model_id', 'audit_status', 'is_contacted', 'is_upload_qiniu', 'status')
34 34
 
35
+
35 36
 class AdministratorLoginLogInfoAdmin(admin.ModelAdmin):
36 37
     list_display = ('admin_id', 'admin_name', 'login_ip', 'login_at', 'status', 'created_at', 'updated_at')
37 38
     list_filter = ('admin_id', 'admin_name')

+ 5 - 5
logs/models.py

@@ -53,7 +53,7 @@ class MchInfoEncryptLogInfo(BaseModelMixin):
53 53
             'model_uni_name': model.model_uni_name,
54 54
             'model_name': model.model_name,
55 55
             'operator_name': operator_name,
56
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S')
56
+            'created_at': tc.local_string(utc_dt=self.created_at)
57 57
         }
58 58
 
59 59
 
@@ -191,21 +191,21 @@ class ComplementCodeLogInfo(BaseModelMixin):
191 191
             'audit_status': self.audit_status,
192 192
             'is_contacted': self.is_contacted,
193 193
             'ciphertext': self.ciphertext,
194
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S')
194
+            'created_at': tc.local_string(utc_dt=self.created_at)
195 195
         }
196 196
 
197
+
197 198
 class AdministratorLoginLogInfo(BaseModelMixin):
198 199
     admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'管理员唯一标识')
199 200
     admin_name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'管理员姓名')
200 201
     login_ip = models.CharField(_(u'login_ip'), max_length=32, blank=True, null=True, help_text=_(u'登录IP'))
201 202
     login_at = models.DateTimeField(_(u'login_at'), blank=True, null=True, help_text=_(u'登录时间'))
202 203
 
203
-
204 204
     @property
205 205
     def admindata(self):
206 206
         return {
207 207
             'admin_id': self.admin_id,
208 208
             'admin_name': self.admin_name,
209 209
             'login_ip': self.login_ip,
210
-            'login_at': tc.local_string(utc_dt=self.login_at, format='%Y-%m-%d %H:%M:%S'),
211
-        }
210
+            'login_at': tc.local_string(utc_dt=self.login_at),
211
+        }

+ 1 - 1
mch/models.py

@@ -795,7 +795,7 @@ class ConsumeInfoSubmitLogInfo(BaseModelMixin):
795 795
             'phone': self.phone,
796 796
             'code_version': self.code_version,
797 797
             'dupload': self.dupload,
798
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
798
+            'created_at': tc.local_string(utc_dt=self.created_at),
799 799
         }
800 800
 
801 801
 

+ 2 - 2
member/admin.py

@@ -76,8 +76,8 @@ class ShotTypeInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):
76 76
 
77 77
 
78 78
 class MemberActivityInfoAdmin(admin.ModelAdmin):
79
-    list_display = ('activity_id', 'title', 'subtitle', 'date', 'city', 'location', 'lat', 'lon', 'image', 'cover', 'is_slider', 'slider_image', 'share_img_link', 'share_h5_link', 'is_signup', 'activity_state', 'position', 'is_upload_qiniu', 'status', 'created_at', 'updated_at')
80
-    list_filter = ('is_slider', 'is_signup', 'activity_state', 'is_upload_qiniu', 'status')
79
+    list_display = ('activity_id', 'activity_type', 'title', 'subtitle', 'date', 'start_date', 'end_date', 'start_display_date', 'end_display_date', 'city', 'location', 'lat', 'lon', 'is_slider', 'slider_image', 'cover', 'limit_image_num', 'share_img_link', 'share_h5_link', 'is_signup', 'activity_state', 'position', 'is_upload_qiniu', 'status', 'created_at', 'updated_at')
80
+    list_filter = ('activity_type', 'is_slider', 'is_signup', 'activity_state', 'is_upload_qiniu', 'status')
81 81
 
82 82
 
83 83
 class MemberActivitySignupInfoAdmin(admin.ModelAdmin):

+ 39 - 0
member/migrations/0033_auto_20221021_2212.py

@@ -0,0 +1,39 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 3.2.16 on 2022-10-21 14:12
3
+
4
+from django.db import migrations, models
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('member', '0032_auto_20220704_2001'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AddField(
15
+            model_name='memberactivityinfo',
16
+            name='activity_type',
17
+            field=models.IntegerField(choices=[(0, '线下活动'), (1, '公众号文章'), (2, '线上活动'), (3, '投稿活动')], db_index=True, default=0, help_text='活动类型', verbose_name='activity_type'),
18
+        ),
19
+        migrations.AddField(
20
+            model_name='memberactivityinfo',
21
+            name='end_date',
22
+            field=models.DateField(blank=True, help_text='活动报名截止日期', null=True, verbose_name='end_date'),
23
+        ),
24
+        migrations.AddField(
25
+            model_name='memberactivityinfo',
26
+            name='end_display_date',
27
+            field=models.DateField(blank=True, help_text='活动展示截止日期', null=True, verbose_name='end_display_date'),
28
+        ),
29
+        migrations.AddField(
30
+            model_name='memberactivityinfo',
31
+            name='start_date',
32
+            field=models.DateField(blank=True, help_text='活动报名开始日期', null=True, verbose_name='start_date'),
33
+        ),
34
+        migrations.AddField(
35
+            model_name='memberactivityinfo',
36
+            name='start_display_date',
37
+            field=models.DateField(blank=True, help_text='活动展示开始日期', null=True, verbose_name='start_display_date'),
38
+        ),
39
+    ]

+ 19 - 0
member/migrations/0034_memberactivityinfo_limit_image_num.py

@@ -0,0 +1,19 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 3.2.16 on 2022-10-23 05:28
3
+
4
+from django.db import migrations, models
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('member', '0033_auto_20221021_2212'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AddField(
15
+            model_name='memberactivityinfo',
16
+            name='limit_image_num',
17
+            field=models.IntegerField(default=3, help_text='限制图片数量', verbose_name='limit_image_num'),
18
+        ),
19
+    ]

+ 76 - 34
member/models.py

@@ -124,7 +124,7 @@ class GoodsInfo(BaseModelMixin):
124 124
             'value': self.value,
125 125
             'left_num': self.left_num,
126 126
             'coupon': coupon,
127
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
127
+            'created_at': tc.local_string(utc_dt=self.created_at),
128 128
         }
129 129
 
130 130
     @property
@@ -147,7 +147,7 @@ class GoodsInfo(BaseModelMixin):
147 147
             'desc': self.desc,
148 148
             'left_num': self.left_num,
149 149
             'coupon': coupon,
150
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
150
+            'created_at': tc.local_string(utc_dt=self.created_at),
151 151
         }
152 152
 
153 153
 
@@ -207,7 +207,7 @@ class GoodsOrderInfo(BaseModelMixin):
207 207
             'user_address': self.address,
208 208
             'tracking_number': self.tracking_number,
209 209
             'integral': self.integral,
210
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
210
+            'created_at': tc.local_string(utc_dt=self.created_at),
211 211
             'send_template_message_res': json.loads(self.send_template_message_res) if self.send_template_message_res else '',
212 212
             'remark': self.remark
213 213
         }
@@ -342,20 +342,35 @@ class ShotTypeInfo(BaseModelMixin):
342 342
 
343 343
 
344 344
 class MemberActivityInfo(BaseModelMixin):
345
+    ACTIVITY_TYPE = (
346
+        (0, u'线下活动'),
347
+        (1, u'公众号文章'),
348
+        (2, u'线上活动'),
349
+        (3, u'投稿活动'),
350
+    )
351
+
345 352
     ACTIVITY_STATE = (
346 353
         (0, u'草稿'),
347 354
         (1, u'已发布'),
348 355
         (2, u'下线'),
349 356
     )
357
+
350 358
     brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, default='', help_text=u'品牌唯一标识', db_index=True)
351 359
     brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, default='', help_text=u'品牌名称')
352 360
 
353 361
     activity_id = ShortUUIDField(_(u'activity_id'), max_length=32, blank=True, help_text=u'活动唯一标识', db_index=True, unique=True)
354 362
 
363
+    activity_type = models.IntegerField(_(u'activity_type'), choices=ACTIVITY_TYPE, default=0, help_text=u'活动类型', db_index=True)
364
+
355 365
     title = models.CharField(_(u'title'), max_length=255, blank=True, default='', help_text=u'活动名称')
356 366
     subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, default='', help_text=u'活动二级名称')
357 367
 
358 368
     date = models.DateField(_(u'date'), blank=True, null=True, help_text=u'活动时间')
369
+    start_date = models.DateField(_(u'start_date'), blank=True, null=True, help_text=u'活动报名开始日期')
370
+    end_date = models.DateField(_(u'end_date'), blank=True, null=True, help_text=u'活动报名截止日期')
371
+    start_display_date = models.DateField(_(u'start_display_date'), blank=True, null=True, help_text=u'活动展示开始日期')
372
+    end_display_date = models.DateField(_(u'end_display_date'), blank=True, null=True, help_text=u'活动展示截止日期')
373
+
359 374
     city = models.CharField(_(u'city'), max_length=255, blank=True, default='', help_text=u'活动城市')
360 375
     location = models.CharField(_(u'location'), max_length=255, blank=True, default='', help_text=u'活动地点')
361 376
     lat = models.FloatField(_(u'lat'), default=1.0, help_text=u'纬度')
@@ -365,12 +380,11 @@ class MemberActivityInfo(BaseModelMixin):
365 380
     group_share_integral = models.IntegerField(_(u'group_share_integral'), default=0, help_text=u'群组分享会员积分')
366 381
     group_share_max_integral = models.IntegerField(_(u'group_share_max_integral'), default=0, help_text=u'群组分享会员积分单人上限')
367 382
 
368
-    image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, help_text=u'活动内容图片')
369
-
370
-    cover = models.ImageField(_(u'cover'), upload_to=upload_path, blank=True, help_text=u'活动列表图片')
371
-
372 383
     is_slider = models.BooleanField(_(u'is_slider'), default=True, help_text=u'是否为轮播活动')
373 384
     slider_image = models.ImageField(_(u'slider_image'), upload_to=upload_path, blank=True, help_text=u'活动轮播图片')
385
+    cover = models.ImageField(_(u'cover'), upload_to=upload_path, blank=True, help_text=u'活动列表图片')
386
+    limit_image_num = models.IntegerField(_(u'limit_image_num'), default=3, help_text=u'限制图片数量')
387
+    image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, help_text=u'活动内容图片')
374 388
 
375 389
     content_rich_text = RichTextField(_(u'content_rich_text'), blank=True, default='', help_text=u'活动描述')
376 390
 
@@ -393,12 +407,12 @@ class MemberActivityInfo(BaseModelMixin):
393 407
         return '%d' % self.pk
394 408
 
395 409
     @property
396
-    def image_path(self):
397
-        return upload_file_path(self.image)
410
+    def slider_image_path(self):
411
+        return upload_file_path(self.slider_image)
398 412
 
399 413
     @property
400
-    def image_url(self):
401
-        return qiniu_file_url(self.image.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.image)
414
+    def slider_image_url(self):
415
+        return qiniu_file_url(self.slider_image.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.slider_image)
402 416
 
403 417
     @property
404 418
     def cover_path(self):
@@ -408,13 +422,13 @@ class MemberActivityInfo(BaseModelMixin):
408 422
     def cover_url(self):
409 423
         return qiniu_file_url(self.cover.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.cover)
410 424
 
411
-    @property
412
-    def slider_image_path(self):
413
-        return upload_file_path(self.slider_image)
414
-
415
-    @property
416
-    def slider_image_url(self):
417
-        return qiniu_file_url(self.slider_image.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.slider_image)
425
+    # @property
426
+    # def image_path(self):
427
+    #     return upload_file_path(self.image)
428
+    #
429
+    # @property
430
+    # def image_url(self):
431
+    #     return qiniu_file_url(self.image.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.image)
418 432
 
419 433
     @property
420 434
     def final_state(self):
@@ -435,18 +449,25 @@ class MemberActivityInfo(BaseModelMixin):
435 449
         return {
436 450
             'id': self.activity_id,
437 451
             'activity_id': self.activity_id,
452
+            'activity_type': self.activity_type,
453
+            'activity_type_str': dict(MemberActivityInfo.ACTIVITY_TYPE).get(self.activity_type),
438 454
             'title': self.title,
439 455
             'subtitle': self.subtitle,
440
-            'date': self.date.strftime('%Y-%m-%d'),
456
+            'date': tc.local_date_string(self.date),
457
+            'start_date': tc.local_date_string(self.start_date),
458
+            'end_date': tc.local_date_string(self.end_date),
459
+            'start_display_date': tc.local_date_string(self.start_display_date),
460
+            'end_display_date': tc.local_date_string(self.end_display_date),
441 461
             'city': self.city,
442 462
             'location': self.location,
443 463
             'lat': self.lat,
444 464
             'lon': self.lon,
445 465
             'integral': self.integral,
466
+            'slider_image': self.slider_image_url,
446 467
             'cover_url': self.cover_url,
468
+            'limit_image_num': self.limit_image_num,
447 469
             'share_img_link': self.share_img_link,
448 470
             'share_h5_link': self.share_h5_link,
449
-            'slider_image': self.slider_image_url,
450 471
             'state': self.final_state,
451 472
             'is_signed': self.is_signed(user_id),
452 473
             'is_signup': self.is_signup,
@@ -456,19 +477,26 @@ class MemberActivityInfo(BaseModelMixin):
456 477
         return {
457 478
             'id': self.activity_id,
458 479
             'activity_id': self.activity_id,
480
+            'activity_type': self.activity_type,
481
+            'activity_type_str': dict(MemberActivityInfo.ACTIVITY_TYPE).get(self.activity_type),
459 482
             'title': self.title,
460 483
             'subtitle': self.subtitle,
461
-            'date': self.date.strftime('%Y-%m-%d'),
484
+            'date': tc.local_date_string(self.date),
485
+            'start_date': tc.local_date_string(self.start_date),
486
+            'end_date': tc.local_date_string(self.end_date),
487
+            'start_display_date': tc.local_date_string(self.start_display_date),
488
+            'end_display_date': tc.local_date_string(self.end_display_date),
462 489
             'city': self.city,
463 490
             'location': self.location,
464 491
             'lat': self.lat,
465 492
             'lon': self.lon,
466 493
             'integral': self.integral,
467
-            'content_rich_text': self.content_rich_text,
494
+            'slider_image': self.slider_image_url,
468 495
             'cover_url': self.cover_url,
496
+            'limit_image_num': self.limit_image_num,
497
+            'content_rich_text': self.content_rich_text,
469 498
             'share_img_link': self.share_img_link,
470 499
             'share_h5_link': self.share_h5_link,
471
-            'slider_image': self.slider_image_url,
472 500
             'state': self.final_state,
473 501
             'is_signed': self.is_signed(user_id),
474 502
             'is_signup': self.is_signup,
@@ -479,25 +507,32 @@ class MemberActivityInfo(BaseModelMixin):
479 507
         return {
480 508
             'id': self.activity_id,
481 509
             'activity_id': self.activity_id,
510
+            'activity_type': self.activity_type,
511
+            'activity_type_str': dict(MemberActivityInfo.ACTIVITY_TYPE).get(self.activity_type),
482 512
             'title': self.title,
483 513
             'subtitle': self.subtitle,
484
-            'date': self.date.strftime('%Y-%m-%d'),
514
+            'date': tc.local_date_string(self.date),
515
+            'start_date': tc.local_date_string(self.start_date),
516
+            'end_date': tc.local_date_string(self.end_date),
517
+            'start_display_date': tc.local_date_string(self.start_display_date),
518
+            'end_display_date': tc.local_date_string(self.end_display_date),
485 519
             'city': self.city,
486 520
             'location': self.location,
487 521
             'lat': self.lat,
488 522
             'lon': self.lon,
489 523
             'integral': self.integral,
524
+            'is_slider': self.is_slider,
525
+            'slider_image': self.slider_image_url,
490 526
             'cover_url': self.cover_url,
527
+            'limit_image_num': self.limit_image_num,
491 528
             'share_img_link': self.share_img_link,
492 529
             'share_h5_link': self.share_h5_link,
493
-            'slider_image': self.slider_image_url,
494 530
             'state': self.final_state,
495 531
             'is_signup': self.is_signup,
496 532
             'share_integral': self.group_share_integral,
497 533
             'share_max_integral': self.group_share_max_integral,
498
-            'is_slider': self.is_slider,
499 534
             'activity_state': self.activity_state,
500
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
535
+            'created_at': tc.local_string(utc_dt=self.created_at),
501 536
         }
502 537
 
503 538
     @property
@@ -505,28 +540,35 @@ class MemberActivityInfo(BaseModelMixin):
505 540
         return {
506 541
             'id': self.activity_id,
507 542
             'activity_id': self.activity_id,
543
+            'activity_type': self.activity_type,
544
+            'activity_type_str': dict(MemberActivityInfo.ACTIVITY_TYPE).get(self.activity_type),
508 545
             'title': self.title,
509 546
             'subtitle': self.subtitle,
510
-            'date': self.date.strftime('%Y-%m-%d'),
547
+            'date': tc.local_date_string(self.date),
548
+            'start_date': tc.local_date_string(self.start_date),
549
+            'end_date': tc.local_date_string(self.end_date),
550
+            'start_display_date': tc.local_date_string(self.start_display_date),
551
+            'end_display_date': tc.local_date_string(self.end_display_date),
511 552
             'city': self.city,
512 553
             'location': self.location,
513 554
             'lat': self.lat,
514 555
             'lon': self.lon,
515 556
             'integral': self.integral,
516
-            'content_rich_text': self.content_rich_text,
557
+            'is_slider': self.is_slider,
558
+            'banner_path': self.slider_image_path,
559
+            'slider_image': self.slider_image_url,
560
+            'cover_path': self.cover_path,
517 561
             'cover_url': self.cover_url,
562
+            'limit_image_num': self.limit_image_num,
563
+            'content_rich_text': self.content_rich_text,
518 564
             'share_img_link': self.share_img_link,
519 565
             'share_h5_link': self.share_h5_link,
520
-            'slider_image': self.slider_image_url,
521 566
             'state': self.final_state,
522 567
             'is_signup': self.is_signup,
523 568
             'share_integral': self.group_share_integral,
524 569
             'share_max_integral': self.group_share_max_integral,
525 570
             'activity_state': self.activity_state,
526
-            'is_slider': self.is_slider,
527
-            'banner_path': self.slider_image_path,
528
-            'cover_path': self.cover_path,
529
-            'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
571
+            'created_at': tc.local_string(utc_dt=self.created_at),
530 572
         }
531 573
 
532 574
 

+ 1 - 1
requirements.txt

@@ -1,7 +1,7 @@
1 1
 CodeConvert==3.0.2
2 2
 Pillow==9.2.0
3 3
 StatusCode==1.0.0
4
-TimeConvert==2.0.3
4
+TimeConvert==2.0.4
5 5
 furl==2.1.3
6 6
 isoweek==1.3.3
7 7
 jsonfield==3.1.0

+ 1 - 1
requirements_dj.txt

@@ -1,4 +1,4 @@
1
-Django==3.2.14
1
+Django==3.2.16
2 2
 django-admin==2.0.1
3 3
 django-cors-headers==3.10.0
4 4
 django-curtail-uuid==1.0.4